from abc import ABC, abstractmethod
from typing import List

from TicketInfo import TicketInfo


class PlatformAdapter(ABC):
    """
    平台适配器的抽象基类 (统一的“插座”接口)
    所有具体的平台实现都必须继承这个类，并实现其所有抽象方法。
    """

    def __init__(self, config: dict, auth_info: dict):
        """
        初始化适配器。
        :param config: 该平台相关的配置，如商品ID映射表。
        :param auth_info: 认证信息，如 {'session': 'xxx'} 或 {'token': 'yyy'}。
        """
        self.config = config
        self.auth_info = auth_info
        self.name = self.get_platform_name()

    @abstractmethod
    def get_platform_name(self) -> str:
        """
        返回平台的中文名称。
        """
        # 例如，在子类中实现: return "去哪儿"
        pass

    @abstractmethod
    def get_prices(self, standard_ticket_types: List[str], target_date: str) -> List[TicketInfo]:
        """
        【核心方法】获取指定日期和指定标准票种的所有可用价格。

        一个适配器内部需要完成以下工作：
        1. 根据 standard_ticket_types (e.g., ['成人1日票']) 查找 self.config 得到对应的平台商品ID列表。
        2. 遍历这些商品ID。
        3. 调用该平台的API或爬虫，获取每个ID在 target_date 的价格日历。
        4. 将获取到的价格信息，包装成标准化的 TicketInfo 对象。
        5. 返回所有找到的 TicketInfo 对象组成的列表。

        :param standard_ticket_types: 需要查询的标准化票种列表。
        :param target_date: 目标日期 "YYYY-MM-DD"。
        :return: 一个包含多个 TicketInfo 对象的列表。如果没有任何可用票，返回空列表。
        """
        pass

    def sync_products(self) -> dict:
        """
        (可选实现) 同步线上和本地的商品，返回差异报告。
        如果某个平台不需要这个功能，可以直接 pass。
        :return: 一个字典，包含新增和丢失的ID, e.g., {'new': ['id1'], 'lost': ['id2']}
        """
        print(f"平台「{self.name}」未实现产品同步功能。")
        return {'new': [], 'lost': []}